#ifndef epoll_reactor_h__
#define epoll_reactor_h__

#include <unistd.h>
#include <iostream>
#include <map>

#define MAX_EPOLL_EVENTS 1024 // 除去lfd的最大事件数量

// reactor事件信息
struct revent
{
    int fd;          // socket文件描述符
    char *recvdata;  // 数据首地址
    size_t recv_len; // 数据长度
    char *senddata;
    size_t send_len;
    void (*callback)(int, void *); // 回调函数
    void *arg;                     // 回调函数参数
    bool status;                   // true代表当前revent已加入epoll
};

struct reactor
{
    int epoll_fd;                       // epoll红黑树
    revent *rev_list;                   // 自定义事件列表
    std::map<int, std::string> clients; // 客户端map<cfd,用户名>
};

// 函数声明
void reactor_run();
int init_socket(unsigned short port);
void set_revent(revent *rev, int fd, void (*callback)(int, void *), void *arg);
void add_revent(reactor* reac, uint32_t events, revent *rev);
void remove_revent(reactor *reac, revent *rev);
void accept_connection(int fd, void *arg);
void read_fd(int fd, void *arg);
void write_fd(int fd, void *arg);
void error_handling(const char *message);

#endif